package cn.ljy.authority.service;

import cn.ljy.authority.model.SysPermission;
import cn.ljy.authority.model.query.SysPermisssionQuery;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

public interface SysPermissionService  extends BaseService<SysPermission,SysPermisssionQuery>{

    /**
     * 用于提供给前端的树形，直接从数据库读取
     * 说明：
     * 1.先从数据库找到树
     * 2.然后再从结果树中找到结果
     * @param sysPermisssionQuery 查询条件
     * @return
     */
    List<SysPermission> findTree(SysPermisssionQuery sysPermisssionQuery);

    /**
     * 20220505暂时废弃，因需求变化，不在数据库中保存树形菜单的所有路径（例如不保存父节点），需要在显示时对树形菜单的路径进行查找生成完整树，而本方法不包含此作用
     * 用于提供给前端的树形菜单（不包括按钮）
     * 说明：本方法是通过将权限列表以参数形式传入，根据权限的关系一次传入生成
     * @param permissions 将权限集合转为树形形式
     * @return
     */
    @Deprecated
    List<SysPermission> getTreeMenus(@Valid @NotEmpty List<SysPermission> permissions);


    /**
     * 获取指定账户的树形权限，用于前端个人菜单显示
     * 说明：
     * 1.超级管理员账户直接拥有所有树形权限，其余用户会根据所拥有的菜单自动查找所有父路径，以获得完整树结构
     * 2.如果是非超级管理员按照角色来读取，拥有的角色如果不可用则不会读取相关菜单
     * 3.隐藏菜单也会获取，交由前端控制是否显示
     * 4.不可用菜单也会获取
     * 算法(如果是查找菜单类型的权限，算法的前提是菜单树要符合常识，例如按钮下不能有子按钮或子菜单，否则会失败)
     * 1.先获取指定账户的所有权限
     * 2.通过权限推演出所有权限。如果要查找的是菜单，则找出后会移除权限中的按钮，只保留菜单。
     * @param userId
     * @param isMenu 查找的是否是菜单类型的权限，true表示是；false表示查找所有类型的权限
     * @return
     */
    List<SysPermission> getTreePermission(@NotNull Long userId,boolean isMenu);
}
